package leetcode_day._2021._202103;

/**
 * @author yzh
 * @data 2021/3/27 17:27
 * 旋转链表
 * 思路：
 *   先把链表连成一个循环链表
 *   然后再将指针逆向移动 k 次，等于正向移动 len - k 次
 *   最后指针指向的就是头节点，但是要指向头节点的前一个节点，所以要少移动一次
 *   可以先计算链表的长度，这样第二次遍历可以少移动 k % len
 */
public class _27_61 {
    public static void main(String[] args) {
        ListNode head = new ListNode(1, new ListNode(2, null));
        new _27_61().rotateRight(head, 1);
    }

    public ListNode rotateRight(ListNode head, int k) {
        if (k == 0 || head == null) return head;
        ListNode cur = head;
        int len = 0;
        while (cur.next != null) {
            ++len;
            cur = cur.next;
        }
        ++len;
        cur.next = head;
        cur = head;
        k = k % len;
        for (int i = 0; i < len - k - 1; i++) {
            cur = cur.next;
        }
        ListNode ans = cur.next;
        cur.next = null;
        return ans;
    }
}
